package com.tencent.wxpay;

import com.tencent.wxpay.business.*;
import com.tencent.wxpay.businessListener.BaseResultListener;
import com.tencent.wxpay.businessListener.DownloadBillResultListener;
import com.tencent.wxpay.common.Configure;
import com.tencent.wxpay.protocol.request.*;
import com.tencent.wxpay.protocol.response.*;
import com.tencent.wxpay.service.*;

/**
 * SDK总入口
 */
public class WXPay {

    /**
     * 初始化SDK依赖的几个关键配置
     * @param key 签名算法需要用到的秘钥
     * @param appID 公众账号ID
     * @param mchID 商户ID
     * @param certLocalPath HTTP证书在服务器中的路径，用来加载证书用
     * @param certPassword HTTP证书的密码，默认等于MCHID
     */
    public static void initSDKConfiguration(String key,String appID,String mchID,String certLocalPath,String certPassword){
        Configure.setKey(key);
        Configure.setAppID(appID);
        Configure.setMchID(mchID);
        Configure.setCertLocalPath(certLocalPath);
        Configure.setCertPassword(certPassword);
    }

    /**
     * 初始化SDK依赖的几个关键配置
     * @param key 签名算法需要用到的秘钥
     * @param appID 公众账号ID
     * @param mchID 商户ID
     * @param sdbMchID 子商户ID，受理模式必填
     * @param certLocalPath HTTP证书在服务器中的路径，用来加载证书用
     * @param certPassword HTTP证书的密码，默认等于MCHID
     */
    public static void initSDKConfiguration(String key,String appID,String mchID,String sdbMchID,String certLocalPath,String certPassword){
        initSDKConfiguration(key,appID,mchID,certLocalPath,certPassword);
        Configure.setSubMchID(sdbMchID);
    }

    /**
     * 初始化SDK依赖的几个关键配置
     * @param key 签名算法需要用到的秘钥
     * @param appID 公众账号ID
     * @param mchID 商户ID
     * @param sdbMchID 子商户ID，受理模式必填
     * @param certLocalPath HTTP证书在服务器中的路径，用来加载证书用
     * @param certPassword HTTP证书的密码，默认等于MCHID
     * @param ip 服务器ip地址
     */
    public static void initSDKConfiguration(String key,String appID,String mchID,String sdbMchID,String certLocalPath,String certPassword,String ip){
        initSDKConfiguration(key,appID,mchID,sdbMchID,certLocalPath,certPassword);
        Configure.setIp(ip);
    }

    /**
     * 统一下单
     * @param unifiedOrderReqData 这个数据对象里面包含了API要求提交的各种数据字段
     * @return API返回的数据
     * @throws Exception
     */
    public static String unifiedOrder(UnifiedOrderReqData unifiedOrderReqData) throws Exception{
        return new UnifiedOrderService().request(unifiedOrderReqData);
    }

    /**
     * 查询订单
     * @param orderQueryReqData 这个数据对象里面包含了API要求提交的各种数据字段
     * @return API返回的数据
     * @throws Exception
     */
    public static String orderQuery(OrderQueryReqData orderQueryReqData) throws Exception {
        return new OrderQueryService().request(orderQueryReqData);
    }

    /**
     * 关闭订单
     * @param closeOrderReqData 这个数据对象里面包含了API要求提交的各种数据字段
     * @return API返回的数据
     * @throws Exception
     */
    public static String closeOrder(CloseOrderReqData closeOrderReqData) throws Exception {
        return new CloseOrderService().request(closeOrderReqData);
    }

    /**
     * 申请退款
     * @param refundReqData 这个数据对象里面包含了API要求提交的各种数据字段
     * @return API返回的数据
     * @throws Exception
     */
    public static String refund(RefundReqData refundReqData) throws Exception {
        return new RefundService().request(refundReqData);
    }

    /**
     * 查询退款
     * @param refundQueryReqData 这个数据对象里面包含了API要求提交的各种数据字段
     * @return API返回的数据
     * @throws Exception
     */
    public static String refundQuery(RefundQueryReqData refundQueryReqData) throws Exception {
        return new RefundQueryService().request(refundQueryReqData);
    }

    /**
     * 下载对账单
     * @param downloadBillReqData 这个数据对象里面包含了API要求提交的各种数据字段
     * @return API返回的数据
     * @throws Exception
     */
    public static String downloadBill(DownloadBillReqData downloadBillReqData) throws Exception {
        return new DownloadBillService().request(downloadBillReqData);
    }

    /**
     * 执行统一下单服务
     * @param unifiedOrderReqData 统一下单服务请求对象
     * @param resultListener 返回监听器
     * @return UnifiedOrderResData返回数据对象
     * @throws Exception
     */
    public static UnifiedOrderResData doUnifiedOrderBusiness(UnifiedOrderReqData unifiedOrderReqData, BaseResultListener<UnifiedOrderResData> resultListener) throws Exception {
        return UnifiedOrderBusiness.run(unifiedOrderReqData,resultListener);
    }

    /**
     * 执行订单查询服务
     * @param orderQueryReqData 订单查询服务请求对象
     * @param resultListener 返回监听器
     * @return OrderQueryResData返回数据对象
     * @throws Exception
     */
    public static OrderQueryResData doOrderQueryBusiness(OrderQueryReqData orderQueryReqData, BaseResultListener<OrderQueryResData> resultListener) throws Exception {
        return OrderQueryBusiness.run(orderQueryReqData,resultListener);
    }

    /**
     * 执行关闭订单服务
     * @param closeOrderReqData 关闭订单服务请求对象
     * @param resultListener 返回监听器
     * @return CloseOrderResData返回数据对象
     * @throws Exception
     */
    public static CloseOrderResData doCloseOrderBusiness(CloseOrderReqData closeOrderReqData, BaseResultListener<CloseOrderResData> resultListener) throws Exception {
        return CloseOrderBusiness.run(closeOrderReqData,resultListener);
    }

    /**
     * 执行支付回调服务
     * @param payResultResponseString 支付回调服务返回数据
     * @param resultListener 返回监听器
     * @throws Exception
     */
    public static void doPayResultBusiness(String payResultResponseString, BaseResultListener<PayResultResData> resultListener) throws Exception {
        PayResultBusiness.run(payResultResponseString,resultListener);
    }

    /**
     * 执行申请退款业务
     * @param refundReqData 申请退款业务请求对象
     * @param resultListener 返回监听器
     * @return RefundResData返回数据对象
     * @throws Exception
     */
    public static RefundResData doRefundBusiness(RefundReqData refundReqData, BaseResultListener<RefundResData> resultListener) throws Exception {
        return RefundBusiness.run(refundReqData,resultListener);
    }

    /**
     * 执行退款查询业务
     * @param refundQueryReqData 退款查询业务请求对象
     * @param resultListener 返回监听器
     * @return RefundQueryResData返回数据对象
     * @throws Exception
     */
    public static RefundQueryResData doRefundQueryBusiness(RefundQueryReqData refundQueryReqData, BaseResultListener<RefundQueryResData> resultListener) throws Exception {
        return RefundQueryBusiness.run(refundQueryReqData,resultListener);
    }

    /**
     * 执行下载对账单业务
     * @param downloadBillReqData 下载对账单业务请求对象
     * @param resultListener 返回监听器
     * @return Object对象, 调用失败返回 DownloadBillResData对象，调用成功返回纯文本数据的字符串对象
     * @throws Exception
     */
    public static Object doDownloadBillBusiness(DownloadBillReqData downloadBillReqData, DownloadBillResultListener resultListener) throws Exception {
        return DownloadBillBusiness.run(downloadBillReqData,resultListener);
    }
}
